"""
@name : 01.闭包
@author : wenyao
@projectname: xsfh
"""
#生命周期
# def outer():
#     a = 10
#     print(f"test {a}")
# outer()
# print(a)

#LEGB
#
# def outer(x):
#     a = 300
#     def inner():
#         print(x + a)
#     return inner
# d = outer(10)
# d()
# print(dir(d))
# print(d.__closure__)

#形成闭包之后，闭包函数会得到一个非空的__closure__属性

#闭包条件：
#1、必须有一个内嵌函数
#2、内函数必须引用外函数的变量
#3、外函数必须返回内函数

# def outer():
#     # a = 10000
#     tmp_list = []
#     def inner(name):
#         tmp_list.append(1)
#         print("%s -- %s"%(name, tmp_list))
#         # print(id(a),id(tmp_list))
#     return inner
#
# d1 = outer()
# d1("d1")
# d1("d1")
# d2 = outer()
# d2("d2")
# d2("d2")
# print(id(d1), id(d2))
#每次调用外函数，都会重新执行， 创建一个新的tmp_list和inner
#代码虽然一样，但是创建不同对象

# def outer():
#     fs = []
#     for i in range(5):
#         def inner():
#             return i*i
#         fs.append(inner)
#     return fs
# f1, f2, f3, f4, f5 = outer()  #执行完outer之后，i的值为4
# #在调用inner的时候，才会去看i的值
# print(f1())
# print(f2())
# print(f3())
# print(f4())
# print(f5())

# def func1():
#     a = 10000
#     print(id(a))
# func1()
# func1()